package org.zjt.book

import org.apache.spark.mllib.linalg.Vectors
import org.zjt.App.array

/**
  * DESC    不可变长度
  *
  * @author
  * @create 2017-04-25 下午5:10
  **/
object ArrayTest {


  def dim2f(rows: Int, cols: Int) = {
    val d2: Array[Array[Float]] = new Array(rows)
    for (k <- 0 until rows) {
      d2(k) = new Array[Float](cols)
    }
    d2
  }


  def main(args: Array[String]): Unit = {

    /**
      * array数组元素可以翻遍
      */

    var array = Array(1, 2, 34, 3, 2, 34, 6, 12)
    println(array.mkString(","))

    array = array.sortWith(_ > _).reverse
    println(array.mkString(","))


    println(array.takeRight(5).mkString(","))

    for (i <- array) printf("%s,", i)

    println()
    for (i <- 0 until array.length) printf("%s,", array(i))

    printf("min:%s max:%s sum:%s ", array.min, array.max, array.sum)


    println()
    for (i <- 0 until array.length)
      array(i) = array(i) + i
    println(array.mkString(","))


    var a = if (!array.isEmpty) array else ()
    println(a.getClass.getName)


    a = if (array.isEmpty) () else {
      var b = array.length;
      var c = array.map(_ + 10);
      println(c.mkString(","))
      c //else返回的对象，返回的对象通常是放在最后一个语句。
    }


    //0-5 的range步长为2
    println(0 until(5, 2))


    val array1 = Array(1, 2, 3, 2, 3, 4, 2)

    println(array1.tail.mkString(",")) //除了第一个元素以外的[1:]
    println(array1.head) //第一个元素

    println(array1.tail(4)) //倒数第四个
    println(array1.take(3).mkString(",")) //左边拿出三个
    println(array1.takeRight(3).mkString(",")) //右边拿出三个

    println(array1.drop(1).mkString(",")) //删除第一个
    println(array1.zipWithIndex.mkString("\n")) //为元素加上索引（value，索引）

    println(array1.last) //得到最后一个


    // 将tuple键和值拆成两个数组,  unzip: [(1,0),(2,1)]  -> (1,2),(0,1)
    println(array.tail.zipWithIndex.unzip) //拆分(K-V)为indexs和values


    //稀疏向量：(特征个数,(index数组),(value数组))    描述非0变量的索引和值
    //    println(Vectors.sparse(20, array, Array(0.0, 2, 3, 2, 3, 4, 2))) //(20,[1,2,3,2,3,4,2],[1.0,2.0,3.0,2.0,3.0,4.0,2.0])

    //稠密向量：必须描述每一个变量的值
    println(Vectors.dense(Array(0.0, 2, 3, 2, 3, 4, 2)))


    println("ZHAO QIAN SUN LI ZHANG WANG".split(" ").reduce(_ + _))



    //  map 中可以直接使用map遍历修改原来值
    var d2 = Array.ofDim[Float](3, 3)
    d2 = d2.map(a => a.map(_ + 2))
    d2.foreach(a => println(a.mkString(",")))
  }
}
